//自己
class Solution {
public:
    bool isUnique(string astr) {
        int len = astr.size();
        if (len > 26)//一定有重复的;                26个字母
            return false;

        //26个字母与位图(下标是倒着的)进行映射
        int x = 0;//位图
        for (int i=0; i<len; i++)
        {
            int temp = astr[i] - 97;//相对映射,  'a'的ASCII码是97
            //先判断这个位置上有没有字符(这个二进制位是不是1)
            if (x & (1<<temp))
                return false;//已经有了, 就退出
            else 
                x |= (1<<temp);//将这个二进制位设置成1, 做标记
        }
        return true;
    }
};

//答案
class Solution {
public:
    bool isUnique(string astr) {
        //鸽巢原理优化
        if (astr.size() > 26)    return false;

        //26个字母与位图(下标是倒着的)进行映射
        int bitMap = 0;//位图
        for (auto ch : astr)
        {
            int i = ch - 'a';//相对映射,  'a'的ASCII码是97
            //先判断这个位置上字符是否出现过
            if (bitMap & (1<<i))   return false;//已经有了, 就退出
            else    bitMap |= (1<<i);//将这个二进制位设置成1, 做标记
        }
        return true;
    }
};
